/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gmovil_jpa.controladores;

import gmovil_jpa.controladores.exceptions.NonexistentEntityException;
import gmovil_jpa.entidades.DetalleReciboMedioPago;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import gmovil_jpa.entidades.ReciboCaja;
import gmovil_jpa.entidades.TipoMedioPago;

/**
 *
 * @author castlerock
 */
public class DetalleReciboMedioPagoJpaController {

    public DetalleReciboMedioPagoJpaController() {
        emf = Persistence.createEntityManagerFactory("gmovil_jpaPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(DetalleReciboMedioPago detalleReciboMedioPago) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ReciboCaja reciboCaja = detalleReciboMedioPago.getReciboCaja();
            if (reciboCaja != null) {
                reciboCaja = em.getReference(reciboCaja.getClass(), reciboCaja.getIdReciboCaja());
                detalleReciboMedioPago.setReciboCaja(reciboCaja);
            }
            TipoMedioPago tipoMedioPago = detalleReciboMedioPago.getTipoMedioPago();
            if (tipoMedioPago != null) {
                tipoMedioPago = em.getReference(tipoMedioPago.getClass(), tipoMedioPago.getIdTipoMedioPago());
                detalleReciboMedioPago.setTipoMedioPago(tipoMedioPago);
            }
            em.persist(detalleReciboMedioPago);
            if (reciboCaja != null) {
                reciboCaja.getDetalleReciboMedioPagoList().add(detalleReciboMedioPago);
                reciboCaja = em.merge(reciboCaja);
            }
            if (tipoMedioPago != null) {
                tipoMedioPago.getDetalleReciboMedioPagoList().add(detalleReciboMedioPago);
                tipoMedioPago = em.merge(tipoMedioPago);
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(DetalleReciboMedioPago detalleReciboMedioPago) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleReciboMedioPago persistentDetalleReciboMedioPago = em.find(DetalleReciboMedioPago.class, detalleReciboMedioPago.getIdDetalleReciboMedioPago());
            ReciboCaja reciboCajaOld = persistentDetalleReciboMedioPago.getReciboCaja();
            ReciboCaja reciboCajaNew = detalleReciboMedioPago.getReciboCaja();
            TipoMedioPago tipoMedioPagoOld = persistentDetalleReciboMedioPago.getTipoMedioPago();
            TipoMedioPago tipoMedioPagoNew = detalleReciboMedioPago.getTipoMedioPago();
            if (reciboCajaNew != null) {
                reciboCajaNew = em.getReference(reciboCajaNew.getClass(), reciboCajaNew.getIdReciboCaja());
                detalleReciboMedioPago.setReciboCaja(reciboCajaNew);
            }
            if (tipoMedioPagoNew != null) {
                tipoMedioPagoNew = em.getReference(tipoMedioPagoNew.getClass(), tipoMedioPagoNew.getIdTipoMedioPago());
                detalleReciboMedioPago.setTipoMedioPago(tipoMedioPagoNew);
            }
            detalleReciboMedioPago = em.merge(detalleReciboMedioPago);
            if (reciboCajaOld != null && !reciboCajaOld.equals(reciboCajaNew)) {
                reciboCajaOld.getDetalleReciboMedioPagoList().remove(detalleReciboMedioPago);
                reciboCajaOld = em.merge(reciboCajaOld);
            }
            if (reciboCajaNew != null && !reciboCajaNew.equals(reciboCajaOld)) {
                reciboCajaNew.getDetalleReciboMedioPagoList().add(detalleReciboMedioPago);
                reciboCajaNew = em.merge(reciboCajaNew);
            }
            if (tipoMedioPagoOld != null && !tipoMedioPagoOld.equals(tipoMedioPagoNew)) {
                tipoMedioPagoOld.getDetalleReciboMedioPagoList().remove(detalleReciboMedioPago);
                tipoMedioPagoOld = em.merge(tipoMedioPagoOld);
            }
            if (tipoMedioPagoNew != null && !tipoMedioPagoNew.equals(tipoMedioPagoOld)) {
                tipoMedioPagoNew.getDetalleReciboMedioPagoList().add(detalleReciboMedioPago);
                tipoMedioPagoNew = em.merge(tipoMedioPagoNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = detalleReciboMedioPago.getIdDetalleReciboMedioPago();
                if (findDetalleReciboMedioPago(id) == null) {
                    throw new NonexistentEntityException("The detalleReciboMedioPago with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleReciboMedioPago detalleReciboMedioPago;
            try {
                detalleReciboMedioPago = em.getReference(DetalleReciboMedioPago.class, id);
                detalleReciboMedioPago.getIdDetalleReciboMedioPago();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detalleReciboMedioPago with id " + id + " no longer exists.", enfe);
            }
            ReciboCaja reciboCaja = detalleReciboMedioPago.getReciboCaja();
            if (reciboCaja != null) {
                reciboCaja.getDetalleReciboMedioPagoList().remove(detalleReciboMedioPago);
                reciboCaja = em.merge(reciboCaja);
            }
            TipoMedioPago tipoMedioPago = detalleReciboMedioPago.getTipoMedioPago();
            if (tipoMedioPago != null) {
                tipoMedioPago.getDetalleReciboMedioPagoList().remove(detalleReciboMedioPago);
                tipoMedioPago = em.merge(tipoMedioPago);
            }
            em.remove(detalleReciboMedioPago);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<DetalleReciboMedioPago> findDetalleReciboMedioPagoEntities() {
        return findDetalleReciboMedioPagoEntities(true, -1, -1);
    }

    public List<DetalleReciboMedioPago> findDetalleReciboMedioPagoEntities(int maxResults, int firstResult) {
        return findDetalleReciboMedioPagoEntities(false, maxResults, firstResult);
    }

    private List<DetalleReciboMedioPago> findDetalleReciboMedioPagoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(DetalleReciboMedioPago.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public DetalleReciboMedioPago findDetalleReciboMedioPago(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(DetalleReciboMedioPago.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetalleReciboMedioPagoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<DetalleReciboMedioPago> rt = cq.from(DetalleReciboMedioPago.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
